<!DOCTYPE html>
<html lang="en">

<!-- Head tag -->
<head><meta name="generator" content="Hexo 3.8.0">

    <meta charset="utf-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1">

    <!--Description-->

    

    
        <meta name="description" content="一、RTCP协议概述实时传输控制协议(Real-time ControlProtocol，RTCP)与RTP共同定义在1996年提出的RFC1889中，是和 RTP一起工作的控制协议。RTCP单独运行在低层协议上，由低层协议提供数据与控制包的复用。在RTP会话期间，每个会话参与者周期性地向所有其他参">
    

    <!--Author-->
    
        <meta name="author" content="Cyrus">
    

    <!--Open Graph Title-->
    
        <meta property="og:title" content="RTCP详解">
    

    <!--Open Graph Description-->
    
        <meta property="og:description" content="一、RTCP协议概述实时传输控制协议(Real-time ControlProtocol，RTCP)与RTP共同定义在1996年提出的RFC1889中，是和 RTP一起工作的控制协议。RTCP单独运行在低层协议上，由低层协议提供数据与控制包的复用。在RTP会话期间，每个会话参与者周期性地向所有其他参">
    

    <!--Open Graph Site Name-->
        <meta property="og:site_name" content="Cyrus的技术空间">

    <!--Type page-->
    
        <meta property="og:type" content="article">
    

    <!--Page Cover-->
    
    
        <meta property="og:image" content="http://cyrus_huang.gitee.io/bloghttp://www.codeblocq.com/assets/projects/hexo-theme-clean-blog/img/home-bg.jpg">
    

        <meta name="twitter:card" content="summary_large_image">

    

    
        <meta name="twitter:image" content="http://cyrus_huang.gitee.io/bloghttp://www.codeblocq.com/assets/projects/hexo-theme-clean-blog/img/home-bg.jpg">
    

    <!-- Title -->
    
    <title>RTCP详解 - Cyrus的技术空间</title>

    <!-- Bootstrap Core CSS -->
    <link href="//maxcdn.bootstrapcdn.com/bootstrap/3.3.6/css/bootstrap.min.css" rel="stylesheet">

    <!-- Custom CSS -->
    <link rel="stylesheet" href="/blog/css/style.css">

    <!-- Custom Fonts -->
    <link href="//maxcdn.bootstrapcdn.com/font-awesome/4.6.3/css/font-awesome.min.css" rel="stylesheet" type="text/css">
    <link href="//fonts.googleapis.com/css?family=Lora:400,700,400italic,700italic" rel="stylesheet" type="text/css">
    <link href="//fonts.googleapis.com/css?family=Open+Sans:300italic,400italic,600italic,700italic,800italic,400,300,600,700,800" rel="stylesheet" type="text/css">

    <!-- HTML5 Shim and Respond.js IE8 support of HTML5 elements and media queries -->
    <!-- WARNING: Respond.js doesn't work if you view the page via file:// -->
    <!--[if lt IE 9]>
    <script src="//oss.maxcdn.com/libs/html5shiv/3.7.0/html5shiv.js"></script>
    <script src="//oss.maxcdn.com/libs/respond.js/1.4.2/respond.min.js"></script>
    <![endif]-->

    <!-- Gallery -->
    <link href="//cdnjs.cloudflare.com/ajax/libs/featherlight/1.3.5/featherlight.min.css" type="text/css" rel="stylesheet">

    <!-- Google Analytics -->
    


    <!-- favicon -->
    

</head>


<body>

    <!-- Menu -->
    <!-- Navigation -->
<nav class="navbar navbar-default navbar-custom navbar-fixed-top">
    <div class="container-fluid">
        <!-- Brand and toggle get grouped for better mobile display -->
        <div class="navbar-header page-scroll">
            <button type="button" class="navbar-toggle" data-toggle="collapse" data-target="#bs-example-navbar-collapse-1">
                <span class="sr-only">Toggle navigation</span>
                <span class="icon-bar"></span>
                <span class="icon-bar"></span>
                <span class="icon-bar"></span>
            </button>
            <a class="navbar-brand" href="/blog/">Cyrus的技术空间</a>
        </div>

        <!-- Collect the nav links, forms, and other content for toggling -->
        <div class="collapse navbar-collapse" id="bs-example-navbar-collapse-1">
            <ul class="nav navbar-nav navbar-right">
                
                    <li>
                        <a href="/blog/">
                            
                                Home
                            
                        </a>
                    </li>
                
                    <li>
                        <a href="/blog/archives">
                            
                                Archives
                            
                        </a>
                    </li>
                
                    <li>
                        <a href="/blog/tags">
                            
                                Tags
                            
                        </a>
                    </li>
                
                    <li>
                        <a href="/blog/categories">
                            
                                Categories
                            
                        </a>
                    </li>
                
                    <li>
                        <a href="https://github.com/klugjo/hexo-theme-clean-blog">
                            
                                <i class="fa fa-github fa-stack-2x"></i>
                            
                        </a>
                    </li>
                
            </ul>
        </div>
        <!-- /.navbar-collapse -->
    </div>
    <!-- /.container -->
</nav>

    <!-- Main Content -->
    <!-- Page Header -->
<!-- Set your background image for this header in your post front-matter: cover -->

<header class="intro-header" style="background-image: url('http://www.codeblocq.com/assets/projects/hexo-theme-clean-blog/img/home-bg.jpg')">
    <div class="container">
        <div class="row">
            <div class="col-lg-8 col-lg-offset-2 col-md-10 col-md-offset-1">
                <div class="post-heading">
                    <h1>RTCP详解</h1>
                    
                    <span class="meta">
                        <!-- Date and Author -->
                        
                            Posted by Cyrus on
                        
                        
                            2020-07-05
                        
                    </span>
                </div>
            </div>
        </div>
    </div>
</header>

<!-- Post Content -->
<article>
    <div class="container">
        <div class="row">

            <!-- Tags and categories -->
           

            <!-- Gallery -->
            

            <!-- Post Main Content -->
            <div class="col-lg-8 col-lg-offset-2 col-md-10 col-md-offset-1">
                <h3 id="一、RTCP协议概述"><a href="#一、RTCP协议概述" class="headerlink" title="一、RTCP协议概述"></a>一、RTCP协议概述</h3><p>实时传输控制协议(Real-time ControlProtocol，RTCP)与RTP共同定义在1996年提出的RFC1889中，是和 RTP一起工作的控制协议。RTCP单独运行在低层协议上，由低层协议提供数据与控制包的复用。在RTP会话期间，每个会话参与者周期性地向所有其他参与者发送RTCP控制信息包，如下图所示。对于RTP会话或者广播，通常使用单个多目标广播地址，属于这个会话的所有RTP和RTCP信息包都使用这个多目标广播地址，通过使用不同的端口号可把RTP信息包和RTCP信息包区分开来。<br><img src="http://cyrus_huang.gitee.io/blog/2020/07/05/RTCP详解/rtcp_1.png" alt=""></p>
<ul>
<li>rtcp使用的端口一般为对应的rtp端口(偶数)+1；</li>
<li>rtp用于传输数据，而rtcp主要功能是为应用程序提供会话质量或者广播性能质量的信息，这些信息包括发送的信息包数目、丢失的信息包数目和信息包的抖动等情况。</li>
</ul>
<h3 id="二、RTCP协议的类型"><a href="#二、RTCP协议的类型" class="headerlink" title="二、RTCP协议的类型"></a>二、RTCP协议的类型</h3><p>RTCP也是用UDP来传送的，但RTCP封装的仅仅是一些控制信息，因而分组很短，所以可以将多个RTCP分组封装在一个UDP包中。</p>
<p>类似于RTP信息包，每个RTCP信息包以固定部分开始，紧接着的是可变长结构单元，最后以一个32位边界结束。</p>
<p>根据所携带的控制信息不同RTCP信息包可分为RR（接收者报告包）、SR（源报告包）、SEDS（源描述包）、BYE（离开申明）和APP（特殊应用包）五类5类：<br><img src="http://cyrus_huang.gitee.io/blog/2020/07/05/RTCP详解/rtcp_2.png" alt=""><br>这其中最主要的就是RR（接收者报告包）和SR(源报告包）。</p>
<h3 id="三、SR包解析"><a href="#三、SR包解析" class="headerlink" title="三、SR包解析"></a>三、SR包解析</h3><p>发送端报告包，用于发送和接收活动源的统计信息；</p>
<p>发送端报告分组SR（Sender Report）用来使发送端以多播方式向所有接收端报告发送情况。SR分组的主要内容有：相应的RTP流的SSRC，RTP流中最新产生的RTP分组的时间戳和NTP，RTP流包含的分组数，RTP流包含的字节数。SR包的封装如下图所示：<br><img src="http://cyrus_huang.gitee.io/blog/2020/07/05/RTCP详解/rtcp_3.png" alt=""></p>
<p>下面来看一个具体的数据解析：<br><img src="http://cyrus_huang.gitee.io/blog/2020/07/05/RTCP详解/rtcp_4.png" alt=""><br>其中SR的数据如下：</p>
<p>80 c8 00 06 32 b8 51 db e2 a8 6e ba 5d d0 fa 58<br>18 a8 ee ea 00 00 00 02 00 00 00 14</p>
<ul>
<li>80 –&gt; 10(V = 2 RFC1889版本） 0（P padding) 0 0000(RC = 0)</li>
<li>c8 –&gt; PT(200 == SR)</li>
<li>00 06 –&gt; Length(6) 这里解释一下Lenth的含义，就是以4字节为单位，Legth字段该类型包剩下的长度（可以多种类型的RTCP包组合成一个UDP包同时发出），或者这样说，该RTCP包的长度为（Length+1)*4Bytes (前面 80 c8 00 06 已占用4Bytes)。多余的字节补0.</li>
<li>32 b8 51 db –&gt; SSRC SR包发送者的同步源标识符。与对应RTP包中的SSRC一样。</li>
<li>e2 a8 6e ba –&gt; MSW,是从1900年1月1日开始至今的秒数，是绝对时间NTP的整数部分。换算成常用的1970年开始的时间戳要减掉1900年~1970,共53个平年,17个闰年. 则 long long seconds = (long long)((1970 - 1900) <em> 365 + 17) </em> 24 <em> 60 </em> 60 = 2208988800;即 3802689210 - 2208988800 = 1593700410 （2020-07-02 22:33:30）</li>
<li>5d d0 fa 58 –&gt; LSW, 即时间戳的小数部分，换算方法就是LSW/2^32(占用了4字节，网上的有换算到232 picoseconds为单位什么的，感觉把简单的事搞复杂了)。即 1573976664 / 2^32 = 0.3664699</li>
<li>18 a8 ee ea –&gt; RTP timestamp 与rtp包同步的计时</li>
<li>00 00 00 02 –&gt; Sender’s packet count：从开始发送包到产生这个SR包这段时间里，发送者发送的RTP数据包的总数. SSRC改变时，这个域清零。接收端可以用来计算丢包率</li>
<li>00 00 00 14 –&gt; Sender’s octet count：从开始发送包到产生这个SR包这段时间里，发送者发送的净荷数据的总字节数（不包括头部和填充）。发送者改变其SSRC时，这个域要清零。</li>
</ul>
<h3 id="四、RR包解析"><a href="#四、RR包解析" class="headerlink" title="四、RR包解析"></a>四、RR包解析</h3><p>接收者报告包，用于向发送者反馈数据的接收情况：<br>先看一下RR包的数据格式：<br><img src="http://cyrus_huang.gitee.io/blog/2020/07/05/RTCP详解/rtcp_5.png" alt=""></p>
<p>下面再来看一个具体的数据:<br><img src="http://cyrus_huang.gitee.io/blog/2020/07/05/RTCP详解/rtcp_6.png" alt=""><br>其中RR的数据如下：</p>
<p>81 c9 00 07 44 c1 7f 55 32 b8 51 db 00 00 00 00<br>00 00 2d cb 00 00 00 00 6e ba 5d d0 00 01 36 f0</p>
<ul>
<li>80 –&gt; 10(V = 2 RFC1889版本） 0（P padding) 0 0001(RC = 1)</li>
<li>c9 –&gt; PT(201 == RR)</li>
<li>00 07 –&gt; length(7,该RR Length后面有28字节的数据）</li>
<li>44 c1 7f 55 –&gt; 报告者的SSRC,即发出这个RR包端的SSRC</li>
<li>32 b8 51 db –&gt; 目标的SSRC，即上面发SR端的SSRC</li>
<li>00 –&gt; Loss fraction 丢包率，丢包率，它是定义一个rr发送间隔中rtp报文的丢失率。它是一个8bits的数据段，计算方法为，loss fraction=lost rate x 256.举例，丢包率为25%，该字段为25%*256=64</li>
<li>00 00 00 –&gt; cumulative number of packet lost 累积报文丢失总数，该字段是一个24-bits的有符号整数。理论计算方式, packet lost = 期待得到报文数量 - 实际收到报文的数量.实际计算方式, packet lost = 期待收到最新sequence - 第一次收到报文的sequence。</li>
<li>00 00 2d cb –&gt; 被扩展的最大次序号(extended highest sequence number):32 个比特,由于RTP 报文中的次序号只有 16 位,因而数据传输过程经过一段时间后,次序号将 被回置为 0,RTP 协议称这段时间为一个次序号周期(sequence number cycle), 相应于此,被扩展的最大次序号由两部分构成,低 16 位记录了到发送该 RTCP 报文时,收到的 RTP 报文的最大次序号值,高 16 位包含了所经历的次序号周期 数,两者联合反映了应收到的 RTP 数据报文的总数。即 00 00 –&gt; 循环的次数为0， 2d cb –&gt; 本次循环收到的最大序号。</li>
<li>00 00 00 00 –&gt; interarrival jitter, 延时抖动指的是rtp报文发送方的网络传输时间的变量估计值。计算单位是基于时间戳的基础单位，也是32位无符号整形。因为没有发送和接收方的时间同步机制，所以这里关心的不是传输时间，是两次接收到rtp报文传输时间的对比。</li>
<li>6e ba 5d d0 –&gt; LSR: The last sender report timestamp，是最新接收到SR报文的时间戳。具体值是，SR报文里64位NTP时间戳中的32位bit的时间戳。如果没有收到SR报文，该字段为0. 如上面SR的NTP为e2 a8 6e ba 5d d0 fa 58，这里取中间4位，为6e ba 5d d0。</li>
<li>00 01 36 f0 –&gt; DLSR: The delay since last sender report，是接收到SR报文的时刻与发送该RR报文时刻的时间差值，单位时间是1/65536 seconds. 如果没有收到SR报文，该字段为0.</li>
</ul>


                
            </div>

            <!-- Comments -->
            
                <div class="col-lg-8 col-lg-offset-2 col-md-10 col-md-offset-1">
                    


                </div>
            
        </div>
    </div>
</article>

    <!-- Footer -->
    <hr>

<!-- Footer -->
<footer>
    <div class="container">
        <div class="row">
            <div class="col-lg-8 col-lg-offset-2 col-md-10 col-md-offset-1">
                <ul class="list-inline text-center">
                    

                    

                    
                        <li>
                            <a href="https://github.com/klugjo/hexo-theme-clean-blog" target="_blank">
                                <span class="fa-stack fa-lg">
                                    <i class="fa fa-circle fa-stack-2x"></i>
                                    <i class="fa fa-github fa-stack-1x fa-inverse"></i>
                                </span>
                            </a>
                        </li>
                    

                    

                    

                    
                </ul>
                <p class="copyright text-muted">&copy; 2020 Cyrus<br></p>
                <p class="copyright text-muted">Original Theme <a target="_blank" href="http://startbootstrap.com/template-overviews/clean-blog/">Clean Blog</a> from <a href="http://startbootstrap.com/" target="_blank">Start Bootstrap</a></p>
                <p class="copyright text-muted">Adapted for <a target="_blank" href="https://hexo.io/">Hexo</a> by <a href="http://www.codeblocq.com/" target="_blank">Jonathan Klughertz</a></p>
                <p class="copyright text-muted"><a href="http://www.beian.miit.gov.cn">粤ICP备18110122号-1</a></p>
            </div>
        </div>
    </div>
</footer>


    <!-- After footer scripts -->
    
<!-- jQuery -->
<script src="//code.jquery.com/jquery-2.1.4.min.js"></script>

<!-- Bootstrap -->
<script src="//maxcdn.bootstrapcdn.com/bootstrap/3.3.6/js/bootstrap.min.js"></script>

<!-- Gallery -->
<script src="//cdnjs.cloudflare.com/ajax/libs/featherlight/1.3.5/featherlight.min.js" type="text/javascript" charset="utf-8"></script>

<!-- Disqus Comments -->



</body>

</html>